#!/bin/bash
#
# bats wrapper - invokes bats, root & rootless, on podman system tests
#

###############################################################################
# BEGIN usage message

usage="Usage: $0 [--root] [--rootless] [FILENAME-PATTERN[:TEST-PATTERN]]...

$0 is a wrapper for invoking podman system tests.

   --root         Run only as root
   --rootless     Run only as user (i.e. you)
   --remote       Run with podman-remote

   FILENAME-PATTERN Run only test files that match 'test/system/*name*',
                    e.g. '500' or 'net' will match 500-networking.bats.

   TEST-PATTERN     When appended to a filename-pattern, and you have a
                    modern-enough version of bats installed (i.e. Fedora
                    but not RHEL), runs with '--filter TEST-PATTERN' which
                    runs only subtests within FILENAME-PATTERH whose names
                    match that string.

   --tag=TAG      Passed on to bats as '--filter-tags TAG'
                  As of 2025-09-01 the only tag used is 'ci:parallel'

   -t, --tap      Passed on to bats, which will format output in TAP format

   -T             Passed on to bats, which will then show timing data

   --help         display usage message

By default, tests ./bin/podman. To test a different podman, do:

    \$ env PODMAN=/abs/path/to/podman $0 ....

Examples:

    \$ $0 220:\"restart cleans up\"
       ... only the \"restart cleans up\" test in 220-healthcheck.bats

    \$ $0 --root 160:\"ps -f\"
       ... runs all tests in 160-volumes.bats that match \"ps -f\" (root only)
"

# END   usage message
###############################################################################
# BEGIN initialization and command-line arg checking

# By default, test the podman in our working directory.
# Some tests cd out of our workdir, so abs path is important
export PODMAN=${PODMAN:-$(pwd)/bin/podman}
export QUADLET=${QUADLET:-$(pwd)/bin/quadlet}

# Directory in which
TESTS_DIR=test/system

REMOTE=
TEST_ROOT=1
TEST_ROOTLESS=1

declare -a bats_opts=()

declare -a bats_filter=()

declare -a TESTS

for i;do
    value=`expr "$i" : '[^=]*=\(.*\)'`
    case "$i" in
        -h|--help)  echo "$usage"; exit 0;;
        --root)     TEST_ROOTLESS= ;;
        --rootless) TEST_ROOT= ;;
        --remote)   REMOTE=remote ;;
        --tap|-t)   bats_opts+=("-t") ;;
        --ts|-T)    bats_opts+=("-T") ;;
        --tag=*)    bats_filter=("--filter-tags" "$value")
                    if [[ "$value" = "ci:parallel" ]]; then
                        bats_opts+=("--jobs" $(nproc))
                    fi;;
        */*.bats)   TESTS+=("$i") ;;
        *)
            if [[ $i =~ : ]]; then
                tname=${i%:*}          # network:localhost -> network
                filt=${i#*:}           # network:localhost ->   localhost
                TESTS+=($(echo $TESTS_DIR/*$tname*.bats))
                bats_filter=("--filter" "$filt")
            else
                TESTS+=($(echo $TESTS_DIR/*$i*.bats))
            fi
            ;;
    esac
done

if [ ${#TESTS[@]} -eq 0 ] ; then
        TESTS=("$TESTS_DIR")
fi

# With --remote, use correct binary and make sure daem--I mean server--is live
if [[ "$REMOTE" ]]; then
    if ! [[ $PODMAN =~ -remote ]]; then
        PODMAN=${PODMAN}-remote
    fi
    export REMOTESYSTEM_TRANSPORT=unix
fi

# END   initialization and command-line arg checking
###############################################################################

rc=0

# As of 2021-11 podman has a bunch of external helper binaries
if [[ -z "$CONTAINERS_HELPER_BINARY_DIR" ]]; then
    export CONTAINERS_HELPER_BINARY_DIR=$(pwd)/bin
fi

# Used in 120-load test to identify rootless destination for podman image scp
export PODMAN_ROOTLESS_USER=${PODMAN_ROOTLESS_USER:-$(id -un)}

# Make sure to always check for leaks when running locally
export PODMAN_BATS_LEAK_CHECK=1

# Root
if [[ "$TEST_ROOT" ]]; then
    echo "# bats ${bats_opts[*]} ${bats_filter[*]} ${TESTS[*]}"
    sudo    --preserve-env=PODMAN \
            --preserve-env=QUADLET \
            --preserve-env=PODMAN_TEST_DEBUG \
            --preserve-env=CONTAINERS_HELPER_BINARY_DIR \
            --preserve-env=PODMAN_ROOTLESS_USER \
            bats "${bats_opts[@]}" "${bats_filter[@]}" "${TESTS[@]}"
    rc=$?
fi

# Rootless. (Only if we're not already root)
if [[ "$TEST_ROOTLESS" && "$(id -u)" != 0 ]]; then
    echo "--------------------------------------------------"
    echo "\$ bats ${bats_opts[*]} ${bats_filter[*]} ${TESTS[@]}"
    bats "${bats_opts[@]}" "${bats_filter[@]}" "${TESTS[@]}"
    rc=$((rc | $?))
fi

exit $rc
